package risoe.syslab.fhnew.config;

/*
 * Copyright (c) 2012-2014, Technical University of Denmark (DTU)
 * All rights reserved.
 * 
 * The Flexhouse 2.0 platform ("this software") is licensed under the
 * BSD 3-clause license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   - Neither the name of DTU nor the names of its contributors may be used to
 *     endorse or promote products derived from this software without specific
 *     prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE TECHNICAL UNIVERSITY OF DENMARK BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import risoe.syslab.fhnew.hw.DEIFTCPInterface;
import risoe.syslab.fhnew.hw.HardwareInterface;
import risoe.syslab.hw.pollserver.instrument.deif.DEIFAEM180RegisterData;
import risoe.syslab.hw.pollserver.instrument.deif.DEIFMIC2RegisterData;
import risoe.syslab.hw.pollserver.instrument.deif.DEIFMICRegisterData;

@SuppressWarnings("serial")
public class DeifInterfaceConfig extends HWInterfaceConfig implements Serializable {

  public static final String TYPESTRING="DEIF-TCP";
  
  public static final String INSTRTYPE_DEIFMIC=DEIFMICRegisterData._DEVICETYPE;
  public static final String INSTRTYPE_DEIFMIC2=DEIFMIC2RegisterData._DEVICETYPE;
  public static final String INSTRTYPE_DEIFAEM180=DEIFAEM180RegisterData._DEVICETYPE;
  
  public static final String[] DEVICETYPES= {INSTRTYPE_DEIFMIC,INSTRTYPE_DEIFMIC2,INSTRTYPE_DEIFAEM180};
  
  private static final String IP_ATTR = "ip";
  private static final String ID_ATTR = "modbusid";
  private static final String DEVICE_ATTR = "device";
  private static final String CT_ATTR = "ct";
  
  
  private InetAddress ip;
  private int modbusId;
  private String dtype;
  private double ctRatio;
  
  public DeifInterfaceConfig() {
    super();
  }
  
  protected void parseSubInterface(NamedNodeMap attrs) {
	  Node _ip=attrs.getNamedItem(IP_ATTR);
	    if (_ip!=null) {
	      try {
	        ip=InetAddress.getByName(_ip.getNodeValue());
	      }
	      catch (UnknownHostException e) {
	        throw new IllegalArgumentException(HWINTERFACE_TAG+": '"+_ip+"' is not a valid IP address.");
	      }
	    }
	    else {
	      throw new IllegalArgumentException(HWINTERFACE_TAG+": Missing '"+IP_ATTR+"' attribute.");
	    }
	  
    Node _id=attrs.getNamedItem(ID_ATTR);
    if (_id!=null) {
      modbusId=Integer.valueOf(_id.getNodeValue());
    }
    else {
      throw new IllegalArgumentException(HWINTERFACE_TAG+": Missing '"+ID_ATTR+"' attribute.");
    }

    dtype=null;
    Node _device=attrs.getNamedItem(DEVICE_ATTR);
    if (_device!=null) {
      for (String dt:DEVICETYPES) {
        if (dt.equals(_device.getNodeValue())) {
          dtype=dt;
        }
      }
      if (dtype==null) {
        throw new IllegalArgumentException(HWINTERFACE_TAG+": '"+_device+"' is not a valid device type.");
      }
    }
    else {
      throw new IllegalArgumentException(HWINTERFACE_TAG+": Missing '"+DEVICE_ATTR+"' attribute.");
    }
    
    Node _ct=attrs.getNamedItem(CT_ATTR);
    if (_ct!=null) {
      try {
        ctRatio=Double.valueOf(_ct.getNodeValue());
      }
      catch (NumberFormatException e) {
        throw new IllegalArgumentException(HWINTERFACE_TAG+": '"+_ct+"' is not a valid current transformer ratio.");
      }
    }
    else {
      throw new IllegalArgumentException(HWINTERFACE_TAG+": Missing '"+CT_ATTR+"' attribute.");
    }
    
    
  }

  public String getType() {
    return TYPESTRING;
  }
  
  @Override
	public String getAddress() {
		return ip.toString();
	}

  public InetAddress getIPAddress() {
    return ip;
  }
  
  public int getModbusId(){
	  return modbusId;
  }
  
  public String getDeviceType() {
    return dtype;
  }
  
  public double getCTRatio() {
    return ctRatio;
  }
  
  protected void toStringImpl(StringBuilder b) {
    b.append(", ip=\""+ip.getHostAddress()+"\"");
    b.append(", device=\""+dtype+"\"");
    b.append(", ct=\""+ctRatio+"\"");
  }

  public HardwareInterface getInterfaceInstance() {
    return new DEIFTCPInterface(this);
  }
  
}

